import java.util.HashSet;
import java.util.Set;

public class 快乐数 {
    //每日一题
    // https://leetcode.cn/problems/happy-number/?envType=study-plan-v2&envId=top-interview-150
    //方法一
    public boolean isHappy(long n) {
        //采用哈希表检查每一个数是否重复, 发现重复直接退出循环
        Set<Long> set = new HashSet<>();
        while(n != 1){
            //每次添加元素
            set.add(n);
            long cur = 0;
            //提取每一位×并相加
            while(n != 0){
                long t = n % 10;
                cur += t * t;
                n /= 10;
            }
            n = cur;
            //如果有说明死循环了
            if(set.contains(n)){
                return false;
            }
        }
        return true;
    }

    //方法二
    //使用快慢双指针的方法, 当无法得到1, 会出现循环, 得到一个长条一样
    public long powSum(long n) {
        //提取每个元素并平方
        long cur = 0;
        while(n != 0){
            long t = n % 10;
            cur += (t) * (t);
            n /= 10;
        }
        return cur;
    }
    public boolean isHappy1(long n) {
        long fast = n;
        long slow = n;
        //使用do while 第一次必须要执行
        do{
            slow = powSum(slow);
            fast = powSum(powSum(fast));
        }while(slow != fast);
        //结果是1, 说明就会成功, 其他数就是有循环了
        return slow != 1 ? false : true;
    }
}
